package hongjiang.info

object TypeSystemInnerTypeAndTypeProjection extends App {
  //2.1) 直接在外部类中使用内部类型，路径：this 或 Outter.this 

  //  class A {
  //    class B
  //    val b = new B // 相当于 A.this.B
  //  }

  //2.2) 在子类中使用父类的内部类型，路径：super 或 Child.super

  //  class A { class B }
  //  class C extends A { val x = new super.B } // 相当于 C.super.B

  //2.3) 在其他类中使用，路径：outter(外部类实例)

  //  class A { class B }
  //  class C {
  //    val a = new A
  //    val x = new a.B
  //  }

  class A {
    class B;
    //            def foo(b:B) = println(b) //wrong
    def foo(b: A # B) = println(b)
    //内部类型(排除定义在object内部的)，想要表达所有的外部类A实例路径下的B类型，即对 a1.B 和 a2.B及所有的 an.B类型找一个共同的父类型，这就是类型投影，用 A#B的形式表示
  }

  val a1 = new A
  val a2 = new A

  val b1 = new a1.B
  val b2 = new a2.B
}